import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import util.IO;

/**
 * Statistic
 */
public class Statistic {

    static Map<String, Integer> scoreCon;
    static List<String> dirList;
    static List<String> lineList;
    static List<String> rankList;

    public static void scoreCalculator(String hwIndex, String hwDir, String nameListFile) {
        // 对每个学生所有的作业等级进行处理
        for (String dirline : dirList) {
            // 调用配置方法
            Statistic.configureRankScore(hwIndex, hwDir, nameListFile);
            // 初始化平均分数
            String avrString = "null";
            // 初始化10次作业的总分
            int sum = 0;
            // 初始化10次作业的均分
            int avr = 0;
            // 初始化作业打印的格式
            String hwContent;
            // 遍历该生所有作业所取得的全部等级
            for (String rankLine : rankList) {
                // 如果等级栏中包含得有的等级的话，跳出当前循环进行下一次循环
                // 由于计算分数只需要等级，所以这里直接满足条件
                if (rankLine.contains("rank")) {
                    continue;
                }
                // 如果等级记录的命名格式是hw-{n}的形式
                for (int i = 1; i <= 10; i++) {
                    if (rankLine.contains("hw-" + i)) {
                        // 则将“hw{n}，”给直接干掉，留下纯粹的等级
                        String rank = rankLine.replace("hw-" + i + ",", "");
                        // 规定等级评定格式
                        hwContent = dirline.replace("-", ",") + "," + rank + ",";
                        // 根据等级获得成绩映射
                        Statistic.scoreConfigMap();
                        Integer hwScore = scoreCon.get(rank);
                        // 将10次作业的等级累加
                        sum = sum + hwScore;
                    }
                }
            }
            // 计算10次作业的平均成绩
            avr = sum / 10;
            // 将int类型的平均成绩转为字符串类型
            avrString = String.valueOf(avr);
            // 打出格式为“id,name,hw-{n},score”格式的成绩评定
            hwContent += avrString;
        }
    }

    }

    public static void configureRankScore(String hwIndex, String hwDir, String nameListFile) {
        // 获取每个学生的分数文件
        String scoreFile = hwDir + File.separator + "statistic" + File.separator + ".csv";
        // 将名单读取到字符串列表
        lineList = IO.fileToStringList(nameListFile, StandardCharsets.UTF_8);
        // 返回个人名义下的作业目录
        dirList = Init.getDirList(lineList);
        // 输入查找索引号
        int n = Integer.parseInt(hwIndex);
        // 调用等级-成绩映射表
        Statistic.scoreConfigMap();
        // 遍历每个学生的每次作业，设定获取语句的格式
        String content;
        int i = 1;
        while (i > 10) {
            for (String dir : dirList) {
                for (String Line : lineList) {
                    content = "id, " + "name, " + "hw-" + i + "," + "score" + "\n";
                    // 将作业打印的语句解析成UTF-8码
                    IO.stringToFile(scoreFile, StandardCharsets.UTF_8, content);
                }
            }
        }
        for (String dirline : dirList) {
            // 将文件目录中的“，”全部替换成“-”
            String dir = dirline.replace("-", ",");
            // 规定等级打印的格式
            String rankString = hwDir + File.separator + dirline + File.separator + "rank" + ".csv";
            // 将成绩等级列表解析成UTF-8码
            rankList = IO.fileToStringList(rankString, StandardCharsets.UTF_8);
        }
    }

    public static void scoreConfigMap() {
        // 建立等级-分数映射表
        scoreCon = new HashMap<>();
        scoreCon.put("S", 100);
        scoreCon.put("A+", 95);
        scoreCon.put("A", 90);
        scoreCon.put("A-", 85);
        scoreCon.put("B+", 80);
        scoreCon.put("B", 75);
        scoreCon.put("B-", 70);
        scoreCon.put("C", 60);
        scoreCon.put("R", 50);
        scoreCon.put("L", 0);
    }

    public static void main(String[] args) {
        String hwIndex = "1";
        String hwDir = "hw";
        String nameListFile = "name-list.csv";
        Statistic.scoreCalculator(hwIndex, hwDir, nameListFile);
    }
}